#include "Mutex.hpp"

using namespace MyMutex;

int tickit = 1000;
Mutex m;
//pthread_mutex_t mutex;  //初始化锁  动态初始化
//pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //静态初始化， 不需要destroy

void *thread(void *args)
{
    char *id = (char *)args;
    //Mutex* m = static_cast<Mutex*>(args);
    
    while (true)
    {
        //加锁解锁要在临界区      这时候就要涉及一些概念了  
        //共享资源: 多个线程能够访问的资源
        //临界资源: 被保护起来的共享资源    -> 共享的资源可以被多个线程同时访问，将其保护起来，串行访问  就是临界资源
        //临界区:   访问临界资源的代码

        //这里加锁就是把共享资源 tickit保护起来(临界资源) -> ，临界区通过加锁当访问临界资源时候智只能串行访问 
        //pthread_mutex_lock(&mutex); //加锁
        //m.Mutex_lock();

        LockGuard lock(m);  // 使⽤RAII⻛格的锁
        if (tickit > 0)
        {
            printf("%s:%d\n", id,tickit);
            usleep(1000);
            tickit--;
            //pthread_mutex_unlock(&mutex);   //解锁
            //m.Mutex_unlock();
        }
        else
        {
            //m.Mutex_unlock();
            //pthread_mutex_unlock(&mutex);   //解锁  如果这里不解锁，当tickit为0时候，一直阻塞等待，等待解锁
            break;
        }
    }

    return nullptr;
}

int main()
{
    //pthread_mutex_init(&mutex,nullptr);  //初始化锁
    

    

    m.Mutex_init();




    pthread_t rid1, rid2, rid3, rid4;

    pthread_create(&rid1, nullptr, thread, (void *)"thread-1");
    pthread_create(&rid2, nullptr, thread, (void *)"thread-2");
    pthread_create(&rid3, nullptr, thread, (void *)"thread-3");
    pthread_create(&rid4, nullptr, thread, (void *)"thread-4");

    pthread_join(rid1, nullptr);
    // pthread_join(rid2, nullptr);
    // pthread_join(rid3, nullptr);
    // pthread_join(rid4, nullptr);

    //pthread_mutex_destroy(&mutex);  //销毁锁

    return 0;
}